'Соединения шлицевые треугольные
'Автор Ivanov

'###############################################	Закомментить в релизе - начало
'PAR_z   = 36     'Число зубьев
'PAR_Ang = 80     'Угол зуба и впадины отверстия
'PAR_D1_ = 20.260 'Диаметр по вершинам: наружный
'PAR_D2_ = 18.418 'Диаметр по вершинам: внутренний
'PAR_Da_ = 20.03  'Диаметр впадин отверстия
'PAR_da  = 18.66  'Внутренний диаметр отверстия
'PAR_Dv_ = 20     'Наружный диаметр вала
'PAR_dv  = 18.63  'Диаметр впадин вала
'PAR_Ma_ = 21,551 'Номинальный размер между проволочками для вала
'PAR_Mb_ = 17,584 'Номинальный размер между проволочками для отверстия 

'PAR_z   = 48     'Число зубьев
'PAR_Ang = 82.5   'Угол зуба и впадины отверстия
'PAR_D1_ = 60.670 'Диаметр по вершинам: наружный
'PAR_D2_ = 55.572 'Диаметр по вершинам: внутренний
'PAR_Da_ = 60.05  'Диаметр впадин отверстия
'PAR_da  = 57.10  'Внутренний диаметр отверстия
'PAR_Dv_ = 60     'Наружный диаметр вала
'PAR_dv  = 57.05  'Диаметр впадин вала
'PAR_Ma_ = 63,539 'Номинальный размер между проволочками для вала
'PAR_Mb_ = 54,854 'Номинальный размер между проволочками для отверстия 


'PAR_Step = 1 'Шаг штриховки

'PAR_ISP = 2  'Исполнение: 1 - Вал
             '            2 - Отверстие

'###############################################	Закомментить в релизе - конец

Dim Dims

if DETAIL_LEVEL = GCV_EXTENDED then
	Dims = true
else
	Dims = false
end if

Dim tlarr,tl,tiarr,ti,vp,ltvar, dimText,lDimSource,dimDrawing,aDimSource,lDimParam,aDimParam,rDimDrawing,rDimSource,rDimParam

Const ko_ViewParam 			= 8
Const ko_TextLineParam 		= 29
Const ko_TextItemParam 		= 31
Const ko_DimText 			= 42
Const ko_LDimSourceParam 	= 43
Const ko_DimDrawing 		= 44
Const ko_LDimParam 			= 45
Const ko_ADimSourceParam 	= 49
Const ko_ADimParam 			= 50
Const ko_RDimSourceParam 	= 52
Const ko_RDimDrawing		= 53
Const ko_RDimParam			= 54
Const ko_LtVariant			= 108
Const TEXT_LINE_ARR = 3
Const TEXT_ITEM_ARR = 4
Const PI = 3.1415926535897931

Set tlarr = Kompas.GetDynamicArray(TEXT_LINE_ARR)
Set tiarr = Kompas.GetDynamicArray(TEXT_ITEM_ARR)
set tl = Kompas.GetParamStruct(ko_TextLineParam)
Set ti = Kompas.GetParamStruct(ko_TextItemParam)
Set dimText = Kompas.GetParamStruct(ko_DimText)
Set lDimSource = Kompas.GetParamStruct(ko_LDimSourceParam)
Set dimDrawing = Kompas.GetParamStruct(ko_DimDrawing)
Set lDimParam = Kompas.GetParamStruct(ko_LDimParam)
Set aDimSource = Kompas.GetParamStruct(ko_ADimSourceParam)
Set aDimParam = Kompas.GetParamStruct(ko_ADimParam)
Set rDimDrawing = Kompas.GetParamStruct(ko_RDimDrawing)
Set rDimSource = Kompas.GetParamStruct(ko_RDimSourceParam)
Set rDimParam = Kompas.GetParamStruct(ko_RDimParam)

' +++++
' Функция для отрисовки линейных размеров
' Параметры по порядку:
' x1, y1 - координаты первой точки привязки
' x2, y2 - координаты второй точки привязки
' dx, dy - вектор ножки
' n1sh, n2sh - признак отображения соответственно первой и второй ножки
' n1arr, n2arr - тип стрелки соответственно первой и второй ножки
' sign - тип условного значка перед номиналом размера
' text - текст(если будет передан 0, размер будет вычисляться автоматически)
' textBase - параметр отрисовки текста
' textPos - положение текста
' basePoint - параметр, показывающий от какой точки отмерять вектор ножки, 1 - от первой, 2 - от второй
' sDir - направление полки
' nLength - длина ножки полки
' nAng - направление ножки полки
SUB LinDimension (x1, y1, x2, y2, dx, dy, n1sh, n2sh, n1arr, n2arr, sign, text, textBase, textPos, basePoint, sDir, nLength, nAng, extFlag)

	dimText.Init true
	dimDrawing.Init
	lDimSource.Init
	ti.Init
	tl.Init

	'-----------------------
	lDimSource.x1 = x1
	lDimSource.y1 = y1

	lDimSource.x2 = x2
	lDimSource.y2 = y2
	
	lDimSource.basePoint = basePoint
	lDimSource.ps = 3
	
	lDimSource.dx = dx
	lDimSource.dy = dy
	
	'------------------------
	dimDrawing.pt1 = n1arr
	dimDrawing.pt2 = n2arr
	
	dimDrawing.pl1 = n1sh
	dimDrawing.pl2 = n2sh
	
	dimDrawing.lenght = nLength
	
	dimDrawing.ang = nAng
	dimDrawing.shelfDir = sdir
	dimDrawing.textBase = textBase
	dimDrawing.textPos = textPos
	
	'------------------------
	IF (text <> 0) THEN
		tiarr.ksClearArray
		tlarr.ksClearArray
		ti.s = text
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl

		dimText.bitFlag = 0
	ELSE
		dimText.bitFlag = 1
	END IF

	If extFlag = 1 Then 'добавление суффикса x45°
		tiarr.ksClearArray
		ti.init
		ti.iSNumb = 4
		ti.Type = 17
		tiarr.ksAddArrayItem -1, ti
		ti.init
		ti.s = "45"
		tiarr.ksAddArrayItem -1, ti
		ti.init
		ti.iSNumb = 1
		ti.Type = 17
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl

		dimText.SetBitFlagValue 128, true
	End If
	
	dimText.SetTextArr tlarr
	dimText.sign = sign
	
	'-------------------------
	lDimParam.SetTPar dimText
	lDimParam.SetDPar dimDrawing
	lDimParam.SetSPar lDimSource

	doc.ksLinDimension lDimParam
END SUB

' Функция для отрисовки угловых размеров
' Параметры по порядку:
' xc, yc - координаты центра
' ang1, ang2 - углы наклона соответственно первой и второй прямых угла
' rad - радиус дуги размера угла
' nLen - длина ножки
' nAng - угол наклона ножки
' shelfDir - направление выносной полки
' extFlag - флаг доболнительных возможностей
' x1, y1 - координаты начала первой ножки
' x2, y2 - координаты начала второй ножки
' text - текст размера
SUB AngDimension (xc, yc, ang1, ang2, rad, nLen, nAng, shelfDir, extFlag, x1, y1, x2, y2, text)

	dimText.Init true
	dimDrawing.Init
	aDimSource.Init

	'-----------------------
	aDimSource.xc = xc
	aDimSource.yc = yc
	
	aDimSource.x1 = x1
	aDimSource.y1 = y1

	aDimSource.x2 = x2
	aDimSource.y2 = y2
	
	aDimSource.ang1 = ang1
	aDimSource.ang2 = ang2
	
	aDimSource.rad = rad
	'------------------------
	dimDrawing.pt1 = 1
	dimDrawing.pt2 = 1
	
	dimDrawing.lenght = nLen
	dimDrawing.ang = nAng
	dimDrawing.shelfDir = shelfDir

	'------------------------
	dimText.SetBitFlagValue 1, true
	tlarr.ksClearArray
	
	If text <> 0 Then
		tiarr.ksClearArray
		ti.s = text 
		ti.s = ti.s + "°"
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl
		
		dimText.SetBitFlagValue 1, false
	End If

	If extFlag = 1 Then 'добавление суффикса MAX
		tiarr.ksClearArray
		ti.s = " max"
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl

		dimText.SetBitFlagValue 128, true
	End If

	dimText.SetTextArr tlarr
	'-------------------------
	aDimParam.SetTPar dimText
	aDimParam.SetDPar dimDrawing
	aDimParam.SetSPar aDimSource

	doc.ksAngDimension aDimParam

END SUB

' Функция для отрисовки радиальных размеров(без ответвлений)
' Параметры по порядку:
' xc, yc - координаты центра
' rad - радиус
' textPos - длина ножки
' nAng - угол наклона ножки
' sd - направление выносной полки
' n1arr, n2arr - типы стрелок
' extFlag - флаг дополнительных возможностей
SUB RadDimension (xc, yc, rad, sign, text, textPos, nAng, sd, n1arr, n2arr, extFlag)

	dimText.Init true
	rDimDrawing.Init
	rDimSource.Init

	'-----------------------
	rDimSource.xc = xc
	rDimSource.yc = yc
	
	rDimSource.rad = rad
	'------------------------
	rDimDrawing.pt1 = n1arr
	rDimDrawing.pt2 = n2arr

	rDimDrawing.textPos = textPos
	rDimDrawing.ang = nAng

	rDimDrawing.shelfDir = sd

	'------------------------
	IF (text <> 0) THEN
		tiarr.ksClearArray
		tlarr.ksClearArray
		ti.s = text
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl

		dimText.bitFlag = 0
	ELSE
		dimText.bitFlag = 1
	END IF
	
	If extFlag = 1 Then 'добавление суффикса max
		tiarr.ksClearArray
		ti.init
		ti.s = "max"
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl

		dimText.SetBitFlagValue 128, true
	End If

	If extFlag = 2 Then 'добавление суффикса min
		tiarr.ksClearArray
		ti.init
		ti.s = "min"
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl

		dimText.SetBitFlagValue 128, true
	End If

	dimText.SetTextArr tlarr
	dimText.sign = sign
	
	'-------------------------
	rDimParam.SetTPar dimText
	rDimParam.SetDPar rDimDrawing
	rDimParam.SetSPar rDimSource

	doc.ksRadDimension rDimParam

END SUB

FUNCTION arcsin (x)
	arcsin = (180 * atn (x/(sqr(1 - x * x)))) / pi
END FUNCTION

' Функция для вычисления значения масштабирования
dim getScaleField

getScaleField = 0

set vp = Kompas.GetParamStruct(ko_ViewParam)
set ltvar = Kompas.GetParamStruct(ko_LtVariant)
set iter = Kompas.GetIterator
	
const ALLPARAM = -1
const VIEW_LAYER_STATE = 1
const VIEW_OBJ = 123

function GetScale ()
	if getScaleField = 0 then
		ef = false
		i = 0
		vp.Init
		ltvar.Init
		documentType = kompas.ksGetDocumentType(0)
		IF documentType <> 3 THEN 'фрагмент
			iter.ksCreateIterator VIEW_OBJ, 0
			ref = iter.ksMoveIterator ("F")
			IF ref <> 0 THEN 
				DO
					i = i + 1
					doc.ksGetObjParam ref, vp, ALLPARAM
					IF vp.state = 3 THEN 'текущий вид
						getScaleField = vp.scale_
						ef = true
					END IF
					ref = iter.ksMoveIterator ("N")
				LOOP WHILE (ref <> 0 and ef = false and i < 1000)
			END IF
		END IF
		IF getScaleField = 0 THEN getScaleField = 1
	end if
	getScale = getScaleField
end function

' Возвращает тип стрелки для линейных размеров по размеру
function GetArrowType (value)
	
	scale = GetScale
	if abs(value * scale) < 10 then
		GetArrowType = 2
	else
		GetArrowType = 1
	end if
	
end function

'+++++

Dim math, iDA, iPoint, iCON, iTAN

Set math   = Kompas.GetMathematic2D
Set iDA    = Kompas.GetDynamicArray(POINT_ARR)
Set iPoint = Kompas.GetParamStruct(ko_MathPointParam)
Set iCON   = Kompas.GetParamStruct(ko_CON)
Set iTAN   = Kompas.GetParamStruct(ko_TAN)

Const POINT_ARR         = 2
Const ko_MathPointParam = 14
Const ko_CON            = 41
Const ko_TAN            = 40
Const AXES_INC          = 3                     ' На сколько оси выступают за деталь
Const Tan30             = 0.5773502691896258
Const Cos30             = 0.8660254037844386
Const Sqft              = 1.4142135623730950488016887242097 'Корень из двух

' Ищет пересечение между двумя прямыми
Sub GetIntersectLinLin(LineX1, LineY1, Angle1, LineX2, LineY2, Angle2, PointX, PointY)
	PointX = 0
	PointY = 0
	Math.ksIntersectLinLin LineX1, LineY1, Angle1, LineX2, LineY2, Angle2, iDA
	If iDA.ksGetArrayCount = 1 then
		iDA.ksGetArrayItem 0, iPoint
		PointX = iPoint.x
		PointY = iPoint.y
		iDa.ksClearArray
	End If
End Sub

' Ищет пересечение между отрезком и прямой
Sub GetIntersectLinSLin(LineSX1, LineSY1, LineSX2, LineSY2, LineX1, LineY1, LineAngle, PointX, PointY)
	PointX = 0
	PointY = 0
	Math.ksIntersectLinSLine LineSX1, LineSY1, LineSX2, LineSY2, LineX1, LineY1, LineAngle, iDA
	If iDA.ksGetArrayCount = 1 then
		iDA.ksGetArrayItem 0, iPoint
		PointX = iPoint.x
		PointY = iPoint.y
		iDa.ksClearArray
	End If
End Sub

' Ищет пересечение между отрезком и отрезком
Sub GetIntersectLinSLinS(LSX11, LSY11, LSX12, LSY12, LSX21, LSY21, LSX22, LSY22, PointX, PointY)
   PointX = 0
   PointY = 0
   Math.ksIntersectLinSLinS LSX11, LSY11, LSX12, LSY12, LSX21, LSY21, LSX22, LSY22, iDA
   If iDA.ksGetArrayCount = 1 then
    iDA.ksGetArrayItem 0, iPoint
      PointX = iPoint.x
      PointY = iPoint.y
    iDa.ksClearArray
   End If
End Sub

' Ищет пересечение между прямой и дугой
Sub GetIntersectArcLin(ArcX, ArcY, ArcR, ArcAng1, ArcAng2, n, LineX, LineY, Angle, PointX1, PointY1)
	PointX1 = 0
	PointY1 = 0
	Math.ksIntersectArcLin ArcX, ArcY, ArcR, ArcAng1, ArcAng2, n, LineX, LineY, Angle, iDA
	If iDA.ksGetArrayCount > 0 then
		iDA.ksGetArrayItem 0, iPoint
		PointX1 = iPoint.x
		PointY1 = iPoint.y
		iDa.ksClearArray
	End If
End Sub

' Ищет пересечение между окружностью и прямымой
Sub GetIntersectCirLin(CirX, CirY, CirR, LineX, LineY, Angle, PointX1, PointY1, PointX2, PointY2)
	PointX1 = 0
	PointY1 = 0
	PointX2 = 0
	PointY2 = 0
	Math.ksIntersectCirLin CirX, CirY, CirR, LineX, LineY, Angle, iDA
	If iDA.ksGetArrayCount > 0 then
		iDA.ksGetArrayItem 0, iPoint
		PointX1 = iPoint.x
		PointY1 = iPoint.y
		iDA.ksGetArrayItem 1, iPoint
		PointX2 = iPoint.x
		PointY2 = iPoint.y
		iDa.ksClearArray
	End If
End Sub

' Ищет точку касания прямой и окружности
Sub GetTanLinePointCircle(CirX, CirY, CirR, LineX, LineY,  PointX1, PointY1, PointX2, PointY2)
	PointX1 = 0
	PointY1 = 0
	PointX2 = 0
	PointY2 = 0
	Math.ksTanLinePointCircle LineX, LineY, CirX, CirY, CirR, iDA
	If iDA.ksGetArrayCount > 0 then
		iDA.ksGetArrayItem 0, iPoint
		PointX1 = iPoint.x
		PointY1 = iPoint.y
		iDA.ksGetArrayItem 1, iPoint
		PointX2 = iPoint.x
		PointY2 = iPoint.y
		iDa.ksClearArray
	End If
End Sub

' Ищет точку касания прямымой и окружности
Sub GetTanLineAngCircle(CirX, CirY, CirR, LineAng,  PointX1, PointY1, PointX2, PointY2)
	PointX1 = 0
	PointY1 = 0
	PointX2 = 0
	PointY2 = 0
	Math.ksTanLineAngCircle CirX, CirY, CirR, LineAng, iDA
	If iDA.ksGetArrayCount > 0 then
		iDA.ksGetArrayItem 0, iPoint
		PointX1 = iPoint.x
		PointY1 = iPoint.y
		iDA.ksGetArrayItem 1, iPoint
		PointX2 = iPoint.x
		PointY2 = iPoint.y
		iDa.ksClearArray
	End If
End Sub

' Ищет касательную к двум окружностям
Sub GetTanCircleCircle(Xc1, Yc1, Rad1, Xc2, Yc2, Rad2, i,  PointX1, PointY1, PointX2, PointY2)
	PointX1 = 0
	PointY1 = 0
	PointX2 = 0
	PointY2 = 0
	Math.ksTanCircleCircle Xc1, Yc1, Rad1, Xc2, Yc2, Rad2, iTAN
	PointX1 = iTAN.X1(i)
	PointY1 = iTAN.Y1(i)
	PointX2 = iTAN.X2(i)
	PointY2 = iTAN.Y2(i)
End Sub

Sub GetCouplingLineLine(LineX1, LineY1, Angle1, LineX2, LineY2, Angle2, Rad, i, Xc, Yc, X1, Y1, X2, Y2)
	Xc = 0
	Yc = 0
	X1 = 0
	Y1 = 0
	X2 = 0
	Y2 = 0
	Math.ksCouplingLineLine LineX1, LineY1, Angle1, LineX2, LineY2, Angle2, Rad, iCON
	if iCON.getCount > 0 then
		Xc = iCON.GetXc(i)
		Yc = iCON.GetYc(i)
		X1 = iCON.GetX1(i)
		Y1 = iCON.GetY1(i)
		X2 = iCON.GetX2(i)
		Y2 = iCON.GetY2(i)
	End if
End Sub

Sub GetCouplingLineLineByPoint(LineX11, LineY11, LineX12, LineY12, LineX21, LineY21, LineX22, LineY22, Rad, i, Xc, Yc, X1, Y1, X2, Y2)
	Xc = 0
	Yc = 0
	X1 = 0
	Y1 = 0
	X2 = 0
	Y2 = 0
	if (LineX12 - LineX11)<>0 then
		Angle1 = Math.ksAtanD((LineY12 - LineY11)/(LineX12 - LineX11))
	else
		Angle1 = 90
	End if

	if (LineX22 - LineX21)<>0 then
		Angle2 = Math.ksAtanD((LineY22 - LineY21)/(LineX22 - LineX21))
	else
		Angle2 = 90
	End if

	Math.ksCouplingLineLine LineX11, LineY11, Angle1, LineX21, LineY21, Angle2, Rad, iCON
	if iCON.getCount > 0 then
		Xc = iCON.GetXc(i)
		Yc = iCON.GetYc(i)
		X1 = iCON.GetX1(i)
		Y1 = iCON.GetY1(i)
		X2 = iCON.GetX2(i)
		Y2 = iCON.GetY2(i)
	End if
End Sub

Sub GetCouplingLineCircle(Xc, Yc, Radc, LineX, LineY, Angle, Rad, i, resXc, resYc, X1, Y1, X2, Y2)
	resXc = 0
	resYc = 0
	X1 = 0
	Y1 = 0
	X2 = 0
	Y2 = 0
	Math.ksCouplingLineCircle Xc, Yc, Radc, LineX, LineY, Angle, Rad, iCON
	if iCON.getCount > 0 then
		resXc = iCON.GetXc(i)
		resYc = iCON.GetYc(i)
		X1 = iCON.GetX1(i)
		Y1 = iCON.GetY1(i)
		X2 = iCON.GetX2(i)
		Y2 = iCON.GetY2(i)
	End if
End Sub

'Отражает точку относительно указанной оси симметрии
Sub GetMir(PointX, PointY, LineX, LineY, LineAng, resX, resY)
	X = PointX - LineX
	Y = PointY - LineY
	Ln = Sqr(X*X + Y*Y)
	if X<>0 then
		Ang = Math.ksAtanD(Y/X)
	else
		Ang = 90
	End if
	resAng =  2*LineAng - Ang
	resX = Ln * Math.ksCosD(resAng) + LineX
	resY = Ln * Math.ksSinD(resAng) + LineY
End Sub

Sub GetCircleParamBy3Points(X1, Y1, X2, Y2, X3, Y3, Xc, Yc, Rad)
	A1 = X2 - X1
	A2 = X3 - X1
	B1 = Y2 - Y1
	B2 = Y3 - Y1
	C1 = (X2 - X1) * (X2 + X1)/2 + (Y2 - Y1) * (Y2 + Y1)/2
	C2 = (X3 - X1) * (X3 + X1)/2 + (Y3 - Y1) * (Y3 + Y1)/2

	Xc = (C1*B2 - C2*B1)/(A1*B2 - A2*B1)
	Yc = (A1*C2 - A2*C1)/(A1*B2 - A2*B1)

	DeltaX = X1 - Xc
	if DeltaX = 0 then
		res = Y1 - Yc
	else
		DeltaY = Y1 - Yc
		if DeltaY = 0 then
			res = DeltaX
		else
			Tangens = DeltaY/DeltaX
			ArcTangens = Math.ksAtanD(Tangens)
			res = DeltaX/Math.ksCosD(ArcTangens)
		End if
	End if
	if res<0 then
		rad = -res
	else
		rad = res
	End if
End sub

function GetRelAngle (min_ang, max_ang)
	max_d = 75
	min_d = 5
	GetRelAngle = max_ang - (max_ang - min_ang) * ((PAR_Dv_ - min_d) / (max_d - min_d))
end function

Sub Valsh(Contur)
	Razn = PAR_Dv_ - PAR_dv
	HalfAng = 90 - 180/PAR_z
	InitY = -PAR_Dv_/2
	X1 = 0
	Y1 = InitY + PAR_Dv_/2
	GetIntersectCirLin 0, InitY, PAR_Dv_/2, 0, InitY + PAR_D1_/2, PAR_Ang/2 - 90, nul, nul, X2, Y2
	GetIntersectCirLin 0, InitY, PAR_dv/2, X2, Y2, PAR_Ang/2 - 90, nul, nul, X3, Y3
	GetMir X1, Y1, 0, InitY, HalfAng, Xm1, Ym1
	GetMir X2, Y2, 0, InitY, HalfAng, Xm2, Ym2
	GetMir X3, Y3, 0, InitY, HalfAng, Xm3, Ym3
	Xb1 = - Xm1 - Razn/16
	Yb1 = Ym1 -Razn/2
	Xb2 = - (Xm1 + X1)/2
	Yb2 = Ym1 - Razn
	Xb3 = (Xm1 + X1)/2
	Yb3 = Ym1 - Razn
	Xb4 = Xm1 + Razn/26
	Yb4 = Ym1 -Razn/2

	Doc.ksArcByPoint 0, InitY, PAR_Dv_/2, -X2, Y2, X2, Y2, -1, 1
	Doc.ksLineSeg X2, Y2, X3, Y3, 1
	Doc.ksArcByPoint 0, InitY, PAR_dv/2, X3, Y3, Xm3, Ym3, -1, 1
	Doc.ksArcByPoint 0, InitY, PAR_Dv_/2, Xm2, Ym2, Xm1, Ym1, -1, 1
	Doc.ksLineSeg Xm2, Ym2, Xm3, Ym3, 1
	Doc.ksLineSeg -X2, Y2, -X3, Y3, 1
	Doc.ksArcByPoint 0, InitY, PAR_dv/2, -X3, Y3, -Xm3, Ym3, 1, 1
	Doc.ksLineSeg -Xm2, Ym2, -Xm3, Ym3, 1
	Doc.ksArcByPoint 0, InitY, PAR_Dv_/2, -Xm2, Ym2, -Xm1, Ym1, 1, 1

	Doc.ksBezier 0, 2
		Doc.ksPoint -Xm1, Ym1, 0
		Doc.ksPoint Xb1, Yb1, 0
		Doc.ksPoint Xb2, Yb2, 0
		Doc.ksPoint Xb3, Yb3, 0
		Doc.ksPoint Xb4, Yb4, 0
		Doc.ksPoint Xm1, Ym1, 0
	Doc.ksEndObj

	if Contur<>1 then
		Doc.ksHatch 0, 45, PAR_Step, 0, 0, 0
			Doc.ksArcByPoint 0, InitY, PAR_Dv_/2, -X2, Y2, X2, Y2, -1, 1
			Doc.ksLineSeg X2, Y2, X3, Y3, 1
			Doc.ksArcByPoint 0, InitY, PAR_dv/2, X3, Y3, Xm3, Ym3, -1, 1
			Doc.ksArcByPoint 0, InitY, PAR_Dv_/2, Xm2, Ym2, Xm1, Ym1, -1, 1
			Doc.ksLineSeg Xm2, Ym2, Xm3, Ym3, 1
			Doc.ksLineSeg -X2, Y2, -X3, Y3, 1
			Doc.ksArcByPoint 0, InitY, PAR_dv/2, -X3, Y3, -Xm3, Ym3, 1, 1
			Doc.ksLineSeg -Xm2, Ym2, -Xm3, Ym3, 1
			Doc.ksArcByPoint 0, InitY, PAR_Dv_/2, -Xm2, Ym2, -Xm1, Ym1, 1, 1

			Doc.ksBezier 0, 2
				Doc.ksPoint -Xm1, Ym1, 0
				Doc.ksPoint Xb1, Yb1, 0
				Doc.ksPoint Xb2, Yb2, 0
				Doc.ksPoint Xb3, Yb3, 0
				Doc.ksPoint Xb4, Yb4, 0
				Doc.ksPoint Xm1, Ym1, 0
			Doc.ksEndObj
		Doc.ksEndObj
		if Dims = true then
			
			scale = GetScale
			
			' сечение проволочки для вала
			' !!!!!!!!!!!!!!!!!!!!!!!!!! Закомментить в релизе! Осторожно, эрзац настоящего значения! - начало
			REM PAR_dap = 0.343
			' !!!!!!!!!!!!!!!!!!!!!!!!!! Закомментить в релизе! Осторожно, эрзац настоящего значения! - конец
			' за формулами скрывается жесткая геометрия
			acr = PAR_dap / 2
			
			dim angxc90, angyc90, angb90, ange90
			angb90 = math.ksAngle (-x3, y3, -x2, y2)
			ange90 = math.ksAngle (-xm3, ym3, -xm2, ym2)
			GetIntersectLinLin -x2, y2, angb90, -xm2, ym2, ange90, angxc90, angyc90
			tmp_alf = angb90 + (ange90 - angb90) / 2
			
			GetCouplingLineLine -x3, y3, angb90, -xm3, ym3, ange90, acr, 0, acxc, acyc, 0, 0, 0, 0
			PAR_Ma_ = round ((math.ksDistancePntPnt (0, InitY, acxc, acyc) + acr) * 2, 3)
		
			doc.ksCircle acxc, acyc, acr, 2
			
			' размер диаметра сечения проволочки для вала
			RadDimension acxc, acyc, acr, 1, round (acr * 2, 3), 10, 160, -1, 2, 2, 0

			
			' 90°
			AngDimension -angxc90, angyc90, 180 - ange90, 180 - angb90, 10 + 10 * scale, 0, 0, 0, 0, xm2, ym2, x2, y2, 0
			
			' ??°
			dim angxc, angyc, angb, ange
			angb = math.ksAngle (x2, y2, x3, y3)
			ange = math.ksAngle (-x2, y2, -x3, y3)
			GetIntersectLinLin x2, y2, angb, -x2, y2, ange, angxc, angyc
			AngDimension angxc, angyc, ange, angb, 10 + 10 * scale, 0, 0, 0, 0, -x3, y3, x3, y3, 0

			' Db
			Doc.ksArcByAngle 0, InitY, PAR_Dv_ / 2, 90 + GetRelAngle(50, 110), 90 + (180 / PAR_z) * 2, -1, 2
			RadDimension 0, InitY, PAR_Dv_ / 2, 1, PAR_Dv_, 10, 90 + GetRelAngle(45, 105), -1, 2, 2, 0

			' Ma
			Doc.ksArcByAngle 0, InitY, PAR_Ma_ / 2, 90 - GetRelAngle(35, 65), 90 + (180 / PAR_z), 1, 2
			RadDimension 0, InitY, PAR_Ma_ / 2, 1, PAR_Ma_, 10, 90 - GetRelAngle(30, 60), 1, 2, 2, 0
			
			' dv
			Doc.ksArcByAngle 0, InitY, PAR_dv / 2, 90 - GetRelAngle(50, 110), 90 - (180 / PAR_z), 1, 2
			RadDimension 0, InitY, PAR_dv / 2, 1, PAR_dv, 10, 90 - GetRelAngle(45, 105), 1, 2, 2, 1

		end if
	End if
End Sub

Sub Otverstie(Contur)
	Razn = (PAR_Da_ - PAR_da)/2
	HalfAng = 90 - 180/PAR_z
	InitY = -PAR_Dv_/2
	X1 = 0
	Y1 = InitY + PAR_Da_/2

	'GetIntersectCirLin 0, InitY, PAR_D2_/2, 0, InitY + PAR_D1_/2, PAR_Ang/2 - 90, nul, nul, xt2, yt2
	GetIntersectCirLin 0, InitY, PAR_D2_/2, 0, InitY, HalfAng, preX, preY, nul, nul
	GetIntersectCirLin 0, InitY, PAR_Da_/2, preX, preY, PAR_Ang/2 - 90, nul, nul, X2, Y2
	if X2<0 then
		X2 = - X2
	End if
	GetIntersectCirLin 0, InitY, PAR_da/2, X2, Y2, PAR_Ang/2 - 90, nul, nul, X3, Y3
	GetMir X1, Y1, 0, InitY, HalfAng, Xm1, Ym1
	GetMir X2, Y2, 0, InitY, HalfAng, Xm2, Ym2
	GetMir X3, Y3, 0, InitY, HalfAng, Xm3, Ym3
	Xb1 = - Xm1 - Razn/16
	Yb1 = Ym1 +Razn/2
	Xb2 = - (Xm1 + X1)/2
	Yb2 = Ym1 + Razn
	Xb3 = (Xm1 + X1)/2
	Yb3 = Ym1 + Razn
	Xb4 = Xm1 + Razn/26
	Yb4 = Ym1 +Razn/2
	'Doc.ksLineSeg 0, InitY + PAR_D1_/2, xt2, yt2, 2

	Doc.ksArcByPoint 0, InitY, PAR_Da_/2, -X2, Y2, X2, Y2, -1, 1
	Doc.ksLineSeg X2, Y2, X3, Y3, 1
	Doc.ksArcByPoint 0, InitY, PAR_da/2, X3, Y3, Xm3, Ym3, -1, 1
	Doc.ksArcByPoint 0, InitY, PAR_Da_/2, Xm2, Ym2, Xm1, Ym1, -1, 1
	Doc.ksLineSeg Xm2, Ym2, Xm3, Ym3, 1
	Doc.ksLineSeg -X2, Y2, -X3, Y3, 1
	Doc.ksArcByPoint 0, InitY, PAR_da/2, -X3, Y3, -Xm3, Ym3, 1, 1
	Doc.ksLineSeg -Xm2, Ym2, -Xm3, Ym3, 1
	Doc.ksArcByPoint 0, InitY, PAR_Da_/2, -Xm2, Ym2, -Xm1, Ym1, 1, 1

	Doc.ksBezier 0, 2
		Doc.ksPoint -Xm1, Ym1, 0
		Doc.ksPoint Xb1, Yb1, 0
		Doc.ksPoint Xb2, Yb2, 0
		Doc.ksPoint Xb3, Yb3, 0
		Doc.ksPoint Xb4, Yb4, 0
		Doc.ksPoint Xm1, Ym1, 0
	Doc.ksEndObj

	if Contur<>1 then
		Doc.ksHatch 0, 45, PAR_Step, 0, 0, 0
			Doc.ksArcByPoint 0, InitY, PAR_Da_/2, -X2, Y2, X2, Y2, -1, 1
			Doc.ksLineSeg X2, Y2, X3, Y3, 1
			Doc.ksArcByPoint 0, InitY, PAR_da/2, X3, Y3, Xm3, Ym3, -1, 1
			Doc.ksArcByPoint 0, InitY, PAR_Da_/2, Xm2, Ym2, Xm1, Ym1, -1, 1
			Doc.ksLineSeg Xm2, Ym2, Xm3, Ym3, 1
			Doc.ksLineSeg -X2, Y2, -X3, Y3, 1
			Doc.ksArcByPoint 0, InitY, PAR_da/2, -X3, Y3, -Xm3, Ym3, 1, 1
			Doc.ksLineSeg -Xm2, Ym2, -Xm3, Ym3, 1
			Doc.ksArcByPoint 0, InitY, PAR_Da_/2, -Xm2, Ym2, -Xm1, Ym1, 1, 1

			Doc.ksBezier 0, 2
				Doc.ksPoint -Xm1, Ym1, 0
				Doc.ksPoint Xb1, Yb1, 0
				Doc.ksPoint Xb2, Yb2, 0
				Doc.ksPoint Xb3, Yb3, 0
				Doc.ksPoint Xb4, Yb4, 0
				Doc.ksPoint Xm1, Ym1, 0
			Doc.ksEndObj
		Doc.ksEndObj
		if Dims = true then
			
			scale = GetScale
			
			' сечение проволочки для отверстия
			' !!!!!!!!!!!!!!!!!!!!!!!!!! Закомментить в релизе! Осторожно, эрзац настоящего значения! - начало
			REM PAR_dbp = 0.260
			' !!!!!!!!!!!!!!!!!!!!!!!!!! Закомментить в релизе! Осторожно, эрзац настоящего значения! - конец
			acr = PAR_dbp / 2
			
			dim angxc, angyc, angb, ange
			angb = math.ksAngle (x2, y2, x3, y3)
			ange = math.ksAngle (-x2, y2, -x3, y3)
			GetIntersectLinLin x2, y2, angb, -x2, y2, ange, angxc, angyc
			GetIntersectCirLin angxc, angyc, acr, x2, y2, angb, ax1, ay1, 0, 0
			GetIntersectCirLin angxc, angyc, acr, -x2, y2, ange, ax2, ay2, 0, 0
			
			GetCouplingLineLine x2, y2, angb, -x2, y2, ange, acr, 1, acxc, acyc, 0, 0, 0, 0
			
			PAR_Mb_ = round (((acyc - InitY) - acr) * 2 , 3)
			
			doc.ksCircle acxc, acyc, acr, 2
			
			' размер диаметра сечения проволочки для отверстия
			RadDimension acxc, acyc, acr, 1, PAR_dbp, 5 + 5 * scale, 160, -1, 2, 2, 0

			
			' 90°
			dim angxc90, angyc90, angb90, ange90
			angb90 = math.ksAngle(x3, y3, x2, y2)
			ange90 = math.ksAngle(xm3, ym3, xm2, ym2)
			GetIntersectLinLin x2, y2, angb90, xm2, ym2, ange90, angxc90, angyc90
			AngDimension angxc90, angyc90, ange90, angb90, 10 + 10 * scale, 0, 0, 0, 0, xm2, ym2, x2, y2, 0
			
			' ??°
			AngDimension angxc, angyc, ange, angb, 10 + 10 * scale, 0, 0, 0, 0, -x3, y3, x3, y3, 0

			' Da
			Doc.ksArcByAngle 0, InitY, PAR_Da_ / 2, 90 - GetRelAngle(35, 65), 90 - (180 / PAR_z) * 2, 1, 2
			RadDimension 0, InitY, PAR_Da_ / 2, 1, PAR_Da_, 10, 90 - GetRelAngle(30, 60), 1, 2, 2, 2

			' Mb
			Doc.ksArcByAngle 0, InitY, PAR_Mb_ / 2, 90 - GetRelAngle(50, 110), 90, 1, 2
			RadDimension 0, InitY, PAR_Mb_ / 2, 1, PAR_Mb_, 10, 90 - GetRelAngle(45, 105), 1, 2, 2, 0
			
			' da
			Doc.ksArcByAngle 0, InitY, PAR_da / 2, 90 + GetRelAngle(50, 110), 90 + (180 / PAR_z), -1, 2
			RadDimension 0, InitY, PAR_da / 2, 1, PAR_da, 10, 90 + GetRelAngle(45, 105), -1, 2, 2, 2

		end if
	End if
End Sub

Sub MainView(Contur)
	if Contur = 1 then
		Doc.ksColouring &HFE000000
	End if

	if PAR_ISP = 1 then
		Valsh(Contur)
	End if

	if PAR_ISP = 2 then
		Otverstie(Contur)
	End if

	if Contur = 1 then
		Doc.ksEndObj
	End if
End Sub

Sub Script_OnLoad
	MainView(1)
	MainView(-1)
End Sub

